{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import ember\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import altair as alt\n",
    "import lightgbm as lgb\n",
    "import matplotlib.pylab as plt\n",
    "from sklearn.metrics import roc_auc_score, roc_curve\n",
    "_ = alt.renderers.enable('notebook')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "data_dir = \"/data/ember/\" # change this to where you unzipped the download"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Vectorizing training set\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 900000/900000 [07:59<00:00, 1876.27it/s]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Vectorizing test set\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 200000/200000 [01:42<00:00, 1947.39it/s]\n"
     ]
    }
   ],
   "source": [
    "ember.create_vectorized_features(data_dir, 1)\n",
    "_ = ember.create_metadata(data_dir)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "emberdf = ember.read_metadata(data_dir)\n",
    "X_train, y_train, X_test, y_test = ember.read_vectorized_features(data_dir, feature_version=1)\n",
    "lgbm_model = lgb.Booster(model_file=os.path.join(data_dir, \"ember_model_2017.txt\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "var spec = {\"config\": {\"view\": {\"width\": 400, \"height\": 300}, \"mark\": {\"tooltip\": null}}, \"data\": {\"name\": \"data-6c950d5cafa39a66ff09c1beec401d54\"}, \"mark\": \"bar\", \"encoding\": {\"color\": {\"type\": \"nominal\", \"field\": \"label\", \"legend\": {\"values\": [\"unlabeled\", \"benign\", \"malicious\"]}, \"scale\": {\"range\": [\"#00b300\", \"#3333ff\", \"#ff3333\"]}}, \"x\": {\"type\": \"ordinal\", \"axis\": {\"title\": \"Subset\"}, \"field\": \"subset\"}, \"y\": {\"type\": \"quantitative\", \"aggregate\": \"sum\", \"axis\": {\"title\": \"Number of samples\"}, \"field\": \"sha256\"}}, \"$schema\": \"https://vega.github.io/schema/vega-lite/v3.3.0.json\", \"datasets\": {\"data-6c950d5cafa39a66ff09c1beec401d54\": [{\"label\": -1, \"subset\": \"train\", \"sha256\": 300000, \"appeared\": 300000, \"y_pred\": 300000}, {\"label\": 0, \"subset\": \"test\", \"sha256\": 100000, \"appeared\": 100000, \"y_pred\": 100000}, {\"label\": 0, \"subset\": \"train\", \"sha256\": 300000, \"appeared\": 300000, \"y_pred\": 300000}, {\"label\": 1, \"subset\": \"test\", \"sha256\": 100000, \"appeared\": 100000, \"y_pred\": 100000}, {\"label\": 1, \"subset\": \"train\", \"sha256\": 300000, \"appeared\": 300000, \"y_pred\": 300000}]}};\n",
       "var opt = {};\n",
       "var type = \"vega-lite\";\n",
       "var id = \"1add8091-65b4-4a21-a3ba-7449cd86acbd\";\n",
       "\n",
       "var output_area = this;\n",
       "\n",
       "require([\"nbextensions/jupyter-vega/index\"], function(vega) {\n",
       "  var target = document.createElement(\"div\");\n",
       "  target.id = id;\n",
       "  target.className = \"vega-embed\";\n",
       "\n",
       "  var style = document.createElement(\"style\");\n",
       "  style.textContent = [\n",
       "    \".vega-embed .error p {\",\n",
       "    \"  color: firebrick;\",\n",
       "    \"  font-size: 14px;\",\n",
       "    \"}\",\n",
       "  ].join(\"\\\\n\");\n",
       "\n",
       "  // element is a jQuery wrapped DOM element inside the output area\n",
       "  // see http://ipython.readthedocs.io/en/stable/api/generated/\\\n",
       "  // IPython.display.html#IPython.display.Javascript.__init__\n",
       "  element[0].appendChild(target);\n",
       "  element[0].appendChild(style);\n",
       "\n",
       "  vega.render(\"#\" + id, spec, type, opt, output_area);\n",
       "}, function (err) {\n",
       "  if (err.requireType !== \"scripterror\") {\n",
       "    throw(err);\n",
       "  }\n",
       "});\n"
      ],
      "text/plain": [
       "<vega.vegalite.VegaLite at 0x7fcad6df3630>"
      ]
     },
     "metadata": {
      "jupyter-vega": "#1add8091-65b4-4a21-a3ba-7449cd86acbd"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": []
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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"
     },
     "metadata": {
      "jupyter-vega": "#1add8091-65b4-4a21-a3ba-7449cd86acbd"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plotdf = emberdf.copy()\n",
    "gbdf = plotdf.groupby([\"label\", \"subset\"]).count().reset_index()\n",
    "alt.Chart(gbdf).mark_bar().encode(\n",
    "    alt.X('subset:O', axis=alt.Axis(title='Subset')),\n",
    "    alt.Y('sum(sha256):Q', axis=alt.Axis(title='Number of samples')),\n",
    "    alt.Color('label:N', scale=alt.Scale(range=[\"#00b300\", \"#3333ff\", \"#ff3333\"]), legend=alt.Legend(values=[\"unlabeled\", \"benign\", \"malicious\"]))\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "var spec = {\"config\": {\"view\": {\"width\": 400, \"height\": 300}, \"mark\": {\"tooltip\": null}}, \"data\": {\"name\": \"data-eea700dbcbc26d347f412cbeee1170d6\"}, \"mark\": \"bar\", \"encoding\": {\"color\": {\"type\": \"nominal\", \"field\": \"label\", \"legend\": {\"values\": [\"unlabeled\", \"benign\", \"malicious\"]}, \"scale\": {\"range\": [\"#00b300\", \"#3333ff\", \"#ff3333\"]}}, \"x\": {\"type\": \"ordinal\", \"axis\": {\"title\": \"Month appeared\"}, \"field\": \"appeared\"}, \"y\": {\"type\": \"quantitative\", \"aggregate\": \"sum\", \"axis\": {\"title\": \"Number of samples\"}, \"field\": \"sha256\"}}, \"$schema\": \"https://vega.github.io/schema/vega-lite/v3.3.0.json\", \"datasets\": {\"data-eea700dbcbc26d347f412cbeee1170d6\": [{\"appeared\": \" <2017\", \"label\": 0, \"sha256\": 50000, \"subset\": 50000, \"y_pred\": 50000}, {\"appeared\": \"2017-01\", \"label\": -1, \"sha256\": 28606, \"subset\": 28606, \"y_pred\": 28606}, {\"appeared\": \"2017-01\", \"label\": 0, \"sha256\": 17180, \"subset\": 17180, \"y_pred\": 17180}, {\"appeared\": \"2017-01\", \"label\": 1, \"sha256\": 32761, \"subset\": 32761, \"y_pred\": 32761}, {\"appeared\": \"2017-02\", \"label\": -1, \"sha256\": 31394, \"subset\": 31394, \"y_pred\": 31394}, {\"appeared\": \"2017-02\", \"label\": 0, \"sha256\": 32820, \"subset\": 32820, \"y_pred\": 32820}, {\"appeared\": \"2017-02\", \"label\": 1, \"sha256\": 27239, \"subset\": 27239, \"y_pred\": 27239}, {\"appeared\": \"2017-03\", \"label\": -1, \"sha256\": 15656, \"subset\": 15656, \"y_pred\": 15656}, {\"appeared\": \"2017-03\", \"label\": 0, \"sha256\": 25261, \"subset\": 25261, \"y_pred\": 25261}, {\"appeared\": \"2017-03\", \"label\": 1, \"sha256\": 12692, \"subset\": 12692, \"y_pred\": 12692}, {\"appeared\": \"2017-04\", \"label\": -1, \"sha256\": 44344, \"subset\": 44344, \"y_pred\": 44344}, {\"appeared\": \"2017-04\", \"label\": 0, \"sha256\": 24739, \"subset\": 24739, \"y_pred\": 24739}, {\"appeared\": \"2017-04\", \"label\": 1, \"sha256\": 47308, \"subset\": 47308, \"y_pred\": 47308}, {\"appeared\": \"2017-05\", \"label\": -1, \"sha256\": 39689, \"subset\": 39689, \"y_pred\": 39689}, {\"appeared\": \"2017-05\", \"label\": 0, \"sha256\": 29313, \"subset\": 29313, \"y_pred\": 29313}, {\"appeared\": \"2017-05\", \"label\": 1, \"sha256\": 47339, \"subset\": 47339, \"y_pred\": 47339}, {\"appeared\": \"2017-06\", \"label\": -1, \"sha256\": 20311, \"subset\": 20311, \"y_pred\": 20311}, {\"appeared\": \"2017-06\", \"label\": 0, \"sha256\": 20687, \"subset\": 20687, \"y_pred\": 20687}, {\"appeared\": \"2017-06\", \"label\": 1, \"sha256\": 12661, \"subset\": 12661, \"y_pred\": 12661}, {\"appeared\": \"2017-07\", \"label\": -1, \"sha256\": 32677, \"subset\": 32677, \"y_pred\": 32677}, {\"appeared\": \"2017-07\", \"label\": 0, \"sha256\": 29785, \"subset\": 29785, \"y_pred\": 29785}, {\"appeared\": \"2017-07\", \"label\": 1, \"sha256\": 29501, \"subset\": 29501, \"y_pred\": 29501}, {\"appeared\": \"2017-08\", \"label\": -1, \"sha256\": 27323, \"subset\": 27323, \"y_pred\": 27323}, {\"appeared\": \"2017-08\", \"label\": 0, \"sha256\": 20215, \"subset\": 20215, \"y_pred\": 20215}, {\"appeared\": \"2017-08\", \"label\": 1, \"sha256\": 30499, \"subset\": 30499, \"y_pred\": 30499}, {\"appeared\": \"2017-09\", \"label\": -1, \"sha256\": 31823, \"subset\": 31823, \"y_pred\": 31823}, {\"appeared\": \"2017-09\", \"label\": 0, \"sha256\": 20561, \"subset\": 20561, \"y_pred\": 20561}, {\"appeared\": \"2017-09\", \"label\": 1, \"sha256\": 30861, \"subset\": 30861, \"y_pred\": 30861}, {\"appeared\": \"2017-10\", \"label\": -1, \"sha256\": 28177, \"subset\": 28177, \"y_pred\": 28177}, {\"appeared\": \"2017-10\", \"label\": 0, \"sha256\": 29439, \"subset\": 29439, \"y_pred\": 29439}, {\"appeared\": \"2017-10\", \"label\": 1, \"sha256\": 29139, \"subset\": 29139, \"y_pred\": 29139}, {\"appeared\": \"2017-11\", \"label\": 0, \"sha256\": 60449, \"subset\": 60449, \"y_pred\": 60449}, {\"appeared\": \"2017-11\", \"label\": 1, \"sha256\": 51636, \"subset\": 51636, \"y_pred\": 51636}, {\"appeared\": \"2017-12\", \"label\": 0, \"sha256\": 39551, \"subset\": 39551, \"y_pred\": 39551}, {\"appeared\": \"2017-12\", \"label\": 1, \"sha256\": 48364, \"subset\": 48364, \"y_pred\": 48364}]}};\n",
       "var opt = {};\n",
       "var type = \"vega-lite\";\n",
       "var id = \"f83f177f-65a2-432e-8024-515eae3a77a6\";\n",
       "\n",
       "var output_area = this;\n",
       "\n",
       "require([\"nbextensions/jupyter-vega/index\"], function(vega) {\n",
       "  var target = document.createElement(\"div\");\n",
       "  target.id = id;\n",
       "  target.className = \"vega-embed\";\n",
       "\n",
       "  var style = document.createElement(\"style\");\n",
       "  style.textContent = [\n",
       "    \".vega-embed .error p {\",\n",
       "    \"  color: firebrick;\",\n",
       "    \"  font-size: 14px;\",\n",
       "    \"}\",\n",
       "  ].join(\"\\\\n\");\n",
       "\n",
       "  // element is a jQuery wrapped DOM element inside the output area\n",
       "  // see http://ipython.readthedocs.io/en/stable/api/generated/\\\n",
       "  // IPython.display.html#IPython.display.Javascript.__init__\n",
       "  element[0].appendChild(target);\n",
       "  element[0].appendChild(style);\n",
       "\n",
       "  vega.render(\"#\" + id, spec, type, opt, output_area);\n",
       "}, function (err) {\n",
       "  if (err.requireType !== \"scripterror\") {\n",
       "    throw(err);\n",
       "  }\n",
       "});\n"
      ],
      "text/plain": [
       "<vega.vegalite.VegaLite at 0x7fcad6ded978>"
      ]
     },
     "metadata": {
      "jupyter-vega": "#f83f177f-65a2-432e-8024-515eae3a77a6"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": []
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZcAAAF2CAYAAACiftUqAAAgAElEQVR4Xu2dCbhlRXW23ytOiAOoOCtCawg4AY0yGMcIKgiaIO0UVILGIWJQ8wtEUWKMjYBI1CTGATUa1AZjlEAEFYcoitCocUjQgBBFUFBExFn4n+/22nD6cM69+1StfXqfPt9+Hp5L37tr7aqvate7Vw2rFvBlBayAFbACViBZgYVkezZnBayAFbACVgDDxY3AClgBK2AF0hUwXNIltUErYAWsgBUwXNwGrIAVsAJWIF0BwyVdUhu0AlbACliBacDltsBPh6TeIn73u4Hf3wTYFLhmiWq5DXD10N/HpdsM+AVwravZClgBK2AFpqtAl3C5D/AI4KXA/aJY9wI+CFwO/BY4D3gtcCBwCHAJcFPgGXFPo8ZK4ATgYmAr4CDg3DHprgNODPu69xjg3dOV1U+zAlbACsy3Al3C5TDgAcAOA3B5JXAz4NXALcOzEAAEjc2Bq4A3AZcCqweq5gzgWEA/9wOeB+wF/GZEOsFFHs4rgLuELXkxP5/vqnbprYAVsALTU6BLuKgUDwTePwAXDXup8/8l8ETgOGAP4OPAiij2wQEkeSfN9V1gd0A/dwQ+BuwKfGJEOtnX7z8Ai0utNSwm2xdOT1Y/yQpYASsw3wpMGy5S++bA4cDLgCcBVwAnAdtGVRwQw2nPGagazdno7/JotgE+A+w9Jp3meNYAJ0f6HwC7ABetXr36yIWFBXlN119bbrklj3zkI+e7Fbj0VsAKXK/AihUruu4X50LtrkUc9lw0FKaO/9eAPBTBQt6Mhqw0MS+v4yWh/BsHauCz8fu1wM7Aq4CnjEmnITHB6HhgE+DKGDobObF/1FFHXXfYYYd1rcNcNCYX0grMugIXXHDBdUlweTxwWozQfHSMLvpQvgB4ecwNt5Gvjd02djq/p+tOdRgufwY8Adh3qGRfBV4IfA04PeZkzgK2A84B3hAeztEx9/Iz4AhgVDoB7EXAnsD+saBgt3FKGi6dtzE/wArMjAIdwEWjMx8ZI4CG6/8XOBRQ39bmauCylN02djq/Z9pweRfw7KFS/V5A5H3x+1OBpwNaIXYmoGEuVYJgo+sngGDx44DUcDrBRV8M24dXpDmdsw2XztuSH2AFZl6BjuCihUivB/4oRlv0Aa3VsVsHXE4BtgTuBLwjFjNp1OVpwPNjhaz6OX1Qqz9T/zb3cJmksd0KuF0MlSmd/q2VY83ci5Yo3y0m9TV81lzD6Zrf3xO4LFaUjc2HPZdJqsj3WoGNW4GO4KKhfy1s0lC9hue1PUOjKl8OuEjUD8Voi4b1NeJze+DTsY1C+/VeAGgF7n8ZLvVtUMuIBZvz602Nt2C4dKmubVuB2VKgI7hozvipwF0BrR56GHAkIG9Ew2KaXxZwHgx8Cfir+JDW8L48Hm021+80RaAFSfZcZqFZGS6zUEvOoxWYjgIdwUWbxzUKI+9EnsdfD8FFAJFXcv+Yd9aCJQFIQ2D6m/bz6dLK2m8ZLtNpC9VPMVyqJbQBK7DRKNARXFbFPLIilTwzJvAFmPeG5/JD4C9jTkbzMvJgtA9Qm861kkyjN/r/f4uhNHsus9DiDJdZqCXn0QpMR4EO4CJIaHWrwKD5FE3mPxb4cABFS5HlzWieRZdCVwlAmkvWKtnnxu91zz6xIX25Jc7TEWuZp3S9WqwXhVwqE4ZLQhWdwq8SrOjVucWinVOS5tn2uX5jbkr2bGTjVyARLsNiqW0rxJU2dY+6tMpVQNEq2MFLv9PkvuIuDi5k6n1lGC7eRFnfSE9JavT7xMmo2fbqS2gLc6JAh3CZEwVvKKbhYrjUN/psGGTbqy+hLcyJAoZLXkUbLoZLfWvKhkG2vfoS2sKcKGC45FW04WK41LembBhk26svoS3MiQKGS15FGy6GS31ryoZBtr36EtrCnChguORVtOFiuNS3pmwYZNurL6EtzIkChkteRRsuhkt9a8qGQba9+hLawpwoYLjkVbThYrjUt6ZsGGTbqy+hLcyJAjMKF8UsU/T4cXEYdW6Mrjan8S5na7AlbBGHN+qcrRtdhovhUt9tZMMg2159CW1hThSYUbg8I07bffGYalJQTB3GeGyLalzO1qAJHTWvmGgK/2+4DCvgHfotmttyt2TDINvecvn336eqwM47X/eQjAeee+6CIginXj2Cy5PjHBeFgNEOfYWFeRzwSeCLcRSJPAZFW1ZYGB3lLrjoiBKd5vvbiLb87oi4/JiBo+R1n87Nui/wNuA+wL9E/DKd8NvY0lHyOsRMx538TURxVrT6E8KW8rGZ4TKmCRouCe9mNgyy7SUU0SbyFFi58rqUMCZr1y6kj7z0CC6KKabOX4Er7wycC+iMKoWPEQjeDJwMvDbCxggICsd/cQS+1Lkxgo8OIfvzCJapUywfFDHNFERT6b8AfAJ4O/CWCO8vW/J2FHJG8FJomg8CO8WJwRoOOy7Op7nacDFc8nqHYUvZMMi2113JbblAAcOllWhLwUWn9H4PeB3wfeDK8Db+IryQhwIPCEAIBH8ap14eHE8WoHSar4Jm6hCyXwN/CPwU+FzYEkz+GfjbSCNAHRPHBewHfD3AI/h4WGxUldpzadXQl74pGwbZ9hKKaBN5ChgurbQchMu24V00nsvvB1AUtl9nvCjYpbyN1wCXxxkw8nROAhq4yPsQjHR9N4Cge+ShNNf/xBCcbH0+7L114O+fAnTwmY6m1ym/GjZTPg0Xw6VVo578pmwYZNubvERO0aEChksrcTX3ocl1ne+iDvwVA8Ni4+Ci4S3NtzwK2Bf4SMDiwACATsGUR7Mm5ky+Cjwb+EqARF6QvBfBReDS77eLoTIddHYEcEgcv6x5Fw2j3d1w8bBYqxZddFM2DLLtFRXKibpSwHBppawmzt8R8yeCgDr5Yc9FRyXLc9GwmBZJ6ATL84AfxVDXpgEYzYs8PybmtSz5WTHkpbNmNHei65fAw2PRgGxpiE32BDYdN38K8CcBnvfEPI+G5i4F/nhUidInxFrJ1qObPCyWUBnZMMi2l1BEm8hTwHCZSEt17FdNkEJLjgUmeSFa5aXhMB1Wpku2fjfwb/1O9+gY5osALQIYvrR/5tZhr/mb0txp6Hc3Smi4eJ/LBO12zK3ZMMi2V19CW0hUwHBJFLPHpgwXw6W+eWbDINtefQltIVEBwyVRzB6bMlwMl/rmmQ2DbHv1JbSFRAUMl0Qxe2zKcDFc6ptnNgyy7dWX0BYSFTBcEsXssSnDxXCpb57ZMMi2V19CW0hUwHBpJeYkwSbHGdQufO17+WGrJybfZLgYLvVNKhsG2fbqS2gLiQoYLq3EnCTY5DiD2sOiZcxfbvXE5JsMF8OlvkllwyDbXn0JbSFRAcOllZiCS9tgk0+I8C07A/eIeGTvj1hjn4nd9gqAqQ2Z2rWvTZh7jQmCqU2UKZfhYrjUN6RsGGTbqy+hLSQqYLi0ElNwORRoE2xSe1veBDwMEGCUVkNiioj8b7GvRTv8tSFSEZHl0Wj/yqggmB9ulbsWNxkuhkuLZrLMLdkwyLZXX0JbSFTAcGklpgCxNdAm2OTZsXNeQShvEyFc1Lc3cNk9IiQrGKXmchTWpYHLcBBMhXRJuQwXw6W+IWXDINtefQltIVEBw6WVmIJL22CTCsm/fQyH3Qq4BhiEi6IivzNCwWwO/N8AXIbjlCmUf8pluBgu9Q0pGwbZ9upLaAuJChgurcQUXBRtuE2wyV8sAxedGKkDxxRfTMEw/95waVUHdTc5tlidfoups2GQbS+hiDaRp4Dh0kpLRTduG2xSJ1Eu5bnoxE4Nd+mcFx0mJm+lGRZrPJcmCKaHxVpVT4ubDJcWIi13SzYMsu0tl3//faoKGC4TyV0SbHL4AfJcdOn8lj+I0Pk6HKzTy8NiHharb2DZMMi2V19CW0hUwHBJFLOdqRVxBst/A3vECrSPtUtafpfhYriUt54mZTYMsu3Vl9AWEhUwXBLFbG9qk1gpplModXZL55fhYrjUN7JsGGTbqy+hLSQqYLgkitljU4aL4VLfPLNhkG2vvoS2kKiA4ZIoZo9NGS6GS33zzIZBtr36EtpCogKGS6KYNzZ111gJpqONtaHy/BFP016YBwJf7DInhovhUt++smGQba++hLaQqIDhkijmjU1pH8suwAeAu0csseG7dESxQsH8bZc5MVwMl/r2lQ2DbHv1JbSFRAUMl1ZiagOl9q9sGx6IYocpLph27f8JcA7wHED7YX4LvDHCvTRw+ThwX+A44M+Av4k9Lq8EtGrsaOBpwEOAt0eomfeEPT17K0DBLrX58kTgccCDgGPi57uAw5YqyTTgos06w5E2NwO0q/Tagcwp+NqmEbpgXJ7l5sndG7zGpRv1jBvZ9T6XVg196ZuyYZBtL6GINpGngOHSSksFl1QHrs5fMBFY9P97A3eLoJbaEPng6EfXAlsCTw7P5bwY+noVcAHw8ADI64H9IhSMglt+DngfcFY87y+A7QJMLwcUWkb7Y+4JrAEU2FJpPgQ8FbhwXGm6hMt9gEcMROhUHu4YFBRpRUZRUMHVDgQOAS4BbhohCnTITXMpuNoJQV6lOygKPCrddWOeMVIDw6VVQzdcEmSyiXUKGC6tWoLgsi/wx/Gf4oM1ofVfFpBRH6td9w+IfnaL+L2GxRq4fBJ4CvDMeOqO8QEvSCiKsrwYAUSXnqGd/pqnkdczDJfXhf1/XIzLsa6/Hnt1CRe5TCr0DhH+WZnQ7+R9KPzzXYBLAe1AvQpQQDX9lPun368eyPUZwLGAfoq6z4vzCH4zIp3gMvwMeTE/H6WC4dKqoRsuCTLZhOEyQRsQXJqQLhqm0n/6nXbWCy6ChT7A5YnIs9A5LaPg8u2w00RXVr+r/lGh+AUdRUqWB6NLw2z6/28OwEXDcp8Iz+UW4RkJeqvid98bV6Yu4aJnakWCDq1pMv+OyKgmm/RsDYspMJu8Eu0i1SURBCR5J82ljT8KG62fIq92lyqkgQo9nE5w0e8Hn6F7RrpvhssEzX3crdnDWNn2EopoE3kK2HNppeVycHlrzI88Kjycj8T8iA4BG/Rc/gn4qBzGgMHJASrB5f7AZeH9CBIa9noboI9xzd3ocDFN/MsZ0LCYvKADgO8DsiMwCWojr2nDRZnXf8qYLh1W8yzg72LiSr9T5jWcJoo2l+ZsRFB5NDqPQKeraexRBdPvB9Npjmf4GRL7otWrVx+5sLDw6mEl9t9//1a17ZtGK7Dimw3f6xS6YHsNDUO2vbpcOXW2AqtWNcfD11les2bscH+V4RUrVnTdL7bJ31Jw0SS+On8Nff0I+HXMVwsweok0N6OjjfVxr+jKR8X9eq4+3r8+MOciD0irxm4eH+AKD3NrQI6A5nN0TLLmYAQXjRhpKkPnwWhhgcCm8P69gIsmlwSK4wGFI7gS0LrsnwGamJfXIeF0afVDc302fq9JK520Jjty6TTUNZyuOSxn8BkachtcPHC9YXsubdr5MvdkexrZ9hKKaBN5CthzSdNSfZ+GueRJaK5aHb760lGX+kUtotJ89/AlsGjeRd6L+uDmaqYsBu+/A6DhMT1zyatrQg8Pi2ms7kXAnoDcBVF1t6DjC4GvAafH2c9avSBiasmdlsRdEcvnNPciAY8Yk04Cj3rGSCEMl+WaSIu/Z8Mg216LIviW6SlguExP6w35pGnDRUuNT4sJJv2/XDAd0SnoaDmcrlOBp8cY4Zmx21TjLoKNrp8EkH48Jp3gMuoZhktXLS0bBtn2uiq37RYpYLgUyTZzibqGyzhBNH6niSSt9mouhSSQG6Z5FV36t1aONXMvcvu0vluT+oOu23C6xt6oZ9woP/ZcEtpsNgyy7SUU0SbyFDBc8rTss6UNBZc2mmgsUbAZFRunTfpW9xgurWRa+qZsGGTbSyiiTeQpYLjkadlnS32Gy1R0M1wSZM6GQba9hCLaRJ4Chkueln22ZLg4tlh9+8yGQba9+hLaQqIChkuimD02ZbgYLvXNMxsG2fbqS2gLiQoYLoli9tiU4WK41DfPbBhk26svoS0kKmC4JIrZY1OGi+FS3zyzYZBtr76EtpCogOGSKGaPTRkuhkt988yGQba9+hLaQqIChkuimD02ZbgYLvXNMxsG2fbqS2gLiQoYLoli9tiU4WK41DfPbBhk26svoS0kKmC4JIrZY1OGi+FS3zyzYZBtr76EtpCogOGSKGaPTRkuhkt988yGQba9+hLaQqIChkuimD02ZbgYLvXNMxsG2fbqS2gLiQoYLoli9tiU4WK41DfPbBhk26svoS0kKmC4JIrZY1OGi+FS3zyzYZBtr76EtpCogOGSKGaPTRkuhkt988yGQba9+hLaQqIChkuimD02ZbgYLvXNMxsG2fbqS7i+hVOuP3OozvI+i0d8z91luMxHlRsuswCXU3hPSnPch2el2Bk2kg2DbHvZhe57/rLLm2zPcEkWtKfmDJfZgMvgyZvlTWkfuqnv7M422165YqNT9j1/2eVNtme4JAvaU3PddDY9LeyobM3EYWF978yy85dtL7s99j1/2eVNtme4JAvaU3OGiz2X+qaZ3dlm26sv4fCcS789yezyJtszXJIF7ak5w8VwqW+a2TDItldfQsMlUUPDJVHMHpsyXAyX+uaZDYNse/UlNFwSNTRcEsXssSnDxXCpb57ZMMi2V19CwyVRQ8MlUcwemzJcDJf65pkNg2x79SU0XBI1NFwSxeyxKcPFcKlvntkwyLZXX0LDJVFDwyVRzB6bMlwMl/rmmQ2DbHv1JTRcEjXMhsvKldednZG9tWsXdrnggguuW7Fixdz3ixl6zr2I3ueS0IyyYZBtL6GI65noe/6yy5tsrwO4pCwNX7t2YcFwyatsw8WeS31ryu5ss+3Vl9CeS6KGhkuimD02ZbgYLvXNMxsG2fbqSzjfcDmF/0uRcB/uJTuGS4qavTdiuBgu9Y00GwbZ9upLOO9wSRl2ImLbGS7ZDbKf9gwXw6W+ZWbDINtefQkNlwwNDZcMFWfGhuFiuNQ31mwYZNurL6HhkqGh4ZKh4szYMFwMl/rGmg2DbHv1JTRcMjQ0XDJUnBkbhovhUt9Ys2GQba++hIZLhoaGS4aKM2PDcDFc6htrNgyy7dWX0HDJ0NBwyVBxZmwYLoZLfWPNhkG2vfoSGi4ZGhouGSrOjA3DxXCpb6zZMMi2V1/C2YLLv3HPlCI/ie8u2kmuDy9FTqmd3hsxXAyX+kaa3Plkd2b1BRyykF3e7Axm5y/ZnuGSXeH9tGe4GC71LTO58zFcKquk5/VhuFTW74wkN1wMl/qm2vPOrL6A9lxSNPScS4qMs2LEcDFc6tuq4VKmYXS2ZYmXSNXz+rDnkl7jvTS4oeByG+BnwGDMopsAmwLXLKGU0l099Pdx6TYDfgFcu5TyDrmf0C573pkllHB9E9nlzc5gdv6S7Rku2RXeT3vThssWwNsDEFsCJwPvBg4EDgEuAW4KPAO4fECylcAJwMXAVsBBwLlj0glYJwK/jXuPiWeMrAHDJaFhJnc+nnOprJOe14fhUlm/M5J82nB5NrAXsArYHXgXcD/gN8DmwFXAm4BLgdUDGp4BHAvo537A88LOqHSCizycVwB3CVvyYn4+qk4Ml4SW2vPOLKGE9lwyRPScS4aKM2NjErjI67gSuD1wD+C/Ckp5V+ArwJnAHwDHA/8KfAJYEfYOBnYI76R5hNbbC0b6uSPwMWDXMekEF9n7AKDyaVhMti80XBb1yL8MlzJNPedSpluk0smR+t9MT8gnUVZVyXqJ23Y2GqZ6Hywe9tMcHPQeQJ7IJNeewHuBtwG7AL8G/go4Cdg2DB0APAJ4zoDhn8bf5dFsA3wG2HtMutsCa2LITSZ+EM+6aPXq1UcuLCy8ejjD+++//yRlmPq9K77ZcLfu0Rdsf0GdgTGps/OXbS+70POWv+zyrlqlV7j+WrNm3fditr0VK1a07RfrC7ERW2gr4vnA94EvAIcDbwFeFMNPmphve2kY7H+A10daQUNzKJpL0cS8vI6XhLE3Dhj9bPx+LbAz8CrgKTHUNZxOQ2KyK69ok/C2NOQ2cmLfw2Jtq26J++y5lIloz6VMt0hlz6VKvs4Tt4HLLWPV1WMBTY7r348H9Bn8oAmHx/4yPI8/D6icDdwdEDReCHwNOB2Qd3EWsB1wDvAG4Arg6Jh7EdCOAL46Ip3yJ/DJS5JL8lJgt3FKGi4JbcxwKRPRcCnTzXCp0m1aidvARXn5FHCfmGs5MqDymJh/0aqsttedFyMVgeZedL0mVo/tG8Nu+t2pwNM1lBpzMxrm0riQYKPrJwGLHwOj0gkupwHbx9LmPQBBbOTVCVxO4ZltBVnyvn3458W/Z3feKZkbMJKdv2x7fS9v3/OXXB+ZcySSLtOe51zyGmNbuGjyXF6DLg1HfS6Gnd5cmJW7xVJjrfZqrlsBt4vVXfqd/q2VY83ci5YoK50m9Qf3xwyna+wpeN9lsRJtbDY7gkvqmeOGS2ErmxXP4NTFVY31196L7T3/Y8Rwqa+bObTQFi6SRveqw/5lzHVMMtdSIq1eOMFG8z2dXYZLgrTJnY9hWlgnDUx7Xh+ZnoY9l8K2MoVkbeFy31j+q2Ue2n9y/9ioqOW+M30ZLgnV1/POLKGE65voe3l7nj/DJb1F9tJgW7howl2A0a75D8bci5YMNxsfe1m4NpkyXNqotMw9Pe/MEkpouGSI6E2UGSrOjI02cLlFDIVpBZb2ufwu9pecB+wEfHlmSjsio4ZLQu0lw2X7vb6iOb3q65un7aCNuvlXcnnThwF7nj97LvlNso8W28BF+da+Ee3I10otbXzUnhEt9b3DchPmfSz0YJ4Ml4QaSu7MsjufhBLac8kQ0Z5LhoozY6MtXJ4G/FNsfGwKp30mr52Zko7JqOGSUIOGS5mIMzIBn+1ZZX88ZNrzUuSypjwqVVu4KK2Gxx4FbB2bF5t9J3m52QCWDJcE0Q2XMhENlzLdIpV36FfJ13ni5eCiGGA3WyIX2lWvM1Nm9jJcEqrOcCkT0XAp081wqdJtWomXg8tymwG1e3748K5p5T3lOYZLgoyGS5mIhkuZboZLlW7TSrwcXKaVjw32HMMlQXrDpUxEw6VMN8OlSrdpJW4LlzsBz4pAkNo1r70uinv1v9PKaFfPMVwSlDVcykQ0XMp0M1yqdJtW4rZw0dzLc4EfAgr7op36+n+Fy1c4mJm9DJeEqjNcykQ0XMp0M1yqdJtW4jZw0Zkoinz8EeCPBs5cOS6OKP7mtDLbxXMMlwRVDZcyEQ2XMt0MlyrdppW4DVyUFx0rfGvgkbGB8gURY8ybKEfVVHJnm73PIL1xJZc3c99CelllMLm882Yvu34z7XmfS94b0xYuCsfxUOB78eh7xCoxnSqpS0cV69z6mbvsudRX2S3es/Ul9VbgV8/6jg6OSz2fIyNfN7JhuJTJ6h36ZbrNaKq2cDkD0EFf467/B+iembsMl/oqy/xyNFwq6mNGhtn63F7suVS0v6GkbeGS98SeWTJc6iukz51FfelGWLDnUiarPZcy3WY0VVu4KLbY8YCWJA9e3kQ5quL73vkkN1bDpVDQGfE0sueE+txe7LkUtuURydrA5SYRZl/JT48J/cbUk+NUyrwcTdmSPZd6wfvcWdSXzp6L4dJJK9rojbaBi+65CnhLTNxvVKIYLvXVabgUamjPpVC4dckcuLJKvs4Tt4GLMvF84OgAzOCmydcDv+o8lx0+wHCpF9dwKdTQcCkUznCpEm5KidvCRccc69TJ4UuhYHSQ2Mxehkt91RkuhRoaLoXCGS5Vwk0pcRu4NDv0PwwcOnTy5MWxY39K2c1/jOFSr6nhUqih4VIonOFSJdyUEreBi7KiIJWbAy+OY46b7F1quIyoKa8WK2q+XYyhF2VkuUR9r9+e56/PHyNeLbZc42//97Zw+cGIZch6iofFRmnd85e7ffNod2efO4t2JZjwrr7Xb8/z1+f2YrhM+C4scXtbuBwO3GaEnb/2hL49lz53FnmvyoClnnfe2UuHs+31ub0YLnlvTFu46IkPBFbEo5Vu29hY6WOOh+uj751PXvtZtNTnziK5qOvM9b1+e56/PrcXwyXvjWkLl6NiMn/4yR4W87CY4VL6PnpCv1S5xXRdzNEZLlVVsl7itnDRnIt25ysysn7eEbg3sOvQjv28nE3JkleL1Qvd5y/R+tLN4LCnPZeiahesDJci6UYmagOXm8UKMW2k1FDYpsCr4iTKew6E4c/L1RQtGS71YhsuhRracykUbl0yey5V8nWeuA1clInmPJcXAv8AXBhHHd8N0HLkmb0Ml/qqM1wKNTRcCoUzXKqEm1LitnDZCjgYeEOcQPmwgIz+PdOX4VJffYZLoYaGS6FwhkuVcFNK3BYuys4WwJXA7QGdRPlfU8pjp48xXOrlNVwKNTRcCoUzXKqEm1LitnB5BvA+4F7A/0Xe3gM8e0r57Owxhku9tIZLoYaGS6FwhkuVcFNK3BYu5wPfB74AaEOlwu+/KDZW/mxKee3kMYZLvayGS6GGhkuhcIZLlXBTStwGLrcEtFHyscAxgP79eOAC4EGzPjxmuNS3NMOlUEPDpVA4w6VKuCklbgMXZeVTwH1iruXIgMpjYv7lt1PKayePMVzqZTVcCjU0XAqFM1yqhJtS4rZw0WZJHRam6ymxNPl44M1TymdnjzFc6qU1XAo1NFwKhTNcqoSbUuK2cBnOjobGBk+knFJ28x9juNRrargUami4FApnuFQJN6XEpXCZUva6f4zhUq+x4VKooeFSKJzhUiXclBIbLkcddd1hhx2Wq0PPYztlty3DpVBRw6VQOMOlSrgpJV6qU9XxxnsD5wA7AV9NjCO2GXAT4OqBcurfilt2zRJl15kyg2l067h0eoZWuV27lJb2XOpbmuFSqKHhUiic4VIl3JQSLwWXW8S8ytuAJ8Umyi8O5evDwCSrxTRX8844wVKd/peBVwMHAocAlwA3BaZ3lTsAACAASURBVLRp8/KBZ60ETgAuBhSK5iDg3DHprgNOjHzpXi2ffvc4PQ2X+pZmuBRqaLgUCme4VAk3pcTLDQetDa9lXHYmPc9FO/ofAigApp79R8CpAbHNgauAN0UwzNUDDz0DOBbQz/2A5wF7Ab8BhtMJLvJwXgHcJWzJi/n5qEIYLvUtzXAp1NBwKRTOcKkSbkqJl4PLrQMuJwF/D/znUL7070k8l9cAO+vwwhhieyXwP8AnBk65VIDMHcI7aR73XWB3QD93BD4WZ8mMSie46PcfCIDJQ9IJmorkfKNrFuCy6Tvv952M9vCLg76xdYadYRuGS6GqhkuhcIZLlXBTSrwcXJpsKLS+wrw8GJAXoM57pCewTL7fBTw8vA5BQkNWTwDWxFkxSn4A8AjgOQO2fhp/V3j/bYDPxHyQoKczZgbT3TbsnRy/10FnuwAXrV69+siFhQUNw6137b///qlyr/hmcxp0ndkLtlcQBFi1SkWuv9asGcnXasPZ+cu2V13AIQPZ9Ttv9rLrN9veihUr2vaL2U1ro7LXVkR19qfEcFMjgOZI/m5CNY4DfhXxyZRUHf8fAl+LiXl5HS8Jm28csP3Z+L2G6eT56LAybeYU4DShP5hOQ2KCkTZ5alGCIjlr6GzkxP4seC7ZnsGEdbbs7dn5y7a3bAEmvOE2b3701ydMMvL2qw8+8/6Lf+j76sLk/GXXb6Y9n0SZ0bLX2WgDF3XeWjF2J+C10aFr6EpejI47/tEE2ZFX8lxAoWMUtl+BMOUVnRfzMIKMjlGWd3EWsF08W+fGXBFRAjT3Ii/qiFjBpvmbwXRaNKCgmnsCckleCuw2Lo+GywS1N+bWzJdbj8i2V1/C9S2k5y+58+47rLL1y7RnuOS9LW3gcofo2F88EO5FcPh4zHucPUF2tAJNE/aajJfXIYhobmTfWI0mU5rgf3rMy5wJaJhL40yCja6fBCx+PCad4HIasH0sbd4DGJtHw2WC2jNcFhXI7MxmwXPZ6vn/+On6VgIXv/UFj+xCv8z6MFwyarq95yIAaRXXN2JoSlDQSqxVsRpLQ1uTXjp4TENXvxtIeKtYotwcm6x/C0TN3IuWKMvL0aS+hsGaazhd8/t7ApfFirKx+TNcJq26G9+f+XJ30fnUl3C+PZe+129m/gyXvLeljeeip/1FzGEMPllDZBqa6urSMmItddZZMp1dhku9tJkvt+FSUR8drT7re/1m5s9wqWh/Q0nbwkXJdAql9qVomOpfw5PJy8kGsmS41Auf+XIbLhX1YbhUiAdr1y4sGC5VEq6XeBK45D21R5YMl/rKMFzKNFRntpiy5xP6fa/fzPwZLmVteVQqw2UGAldmvjx5TecGS9n5y7aXXeb0/BkuRVXUwDmzPgyXoqoYmchwMVyqW1Pmy+1hsYrq8LBYhXgeFqsSb0TiNnDRKi0t+9UmSgWU3KguD4vVV6fhUqahh8XKdGtS2XOp06/r1G3gojxoJ772uWjPyH8PLAXWsuHBZcFd5zfdvuFSL6nhUqah4VKmm+FSp9u0UreFi/ayaIf+8DVpVORplav1cwyX1lKNvdFwKdPQcCnTzXCp021aqdvC5bAIWDmcL+11Uaywmb0Ml/qqM1zKNDRcynQzXOp0m1bqtnBRfu4dYVcUWlfxxP53Wpns8jmGS726hkuZhoZLmW6GS51u00rdFi77AB+NTOkQrz+IUyS1c3+mr7mEyxpunlJpq/i17PQeLqfyeynl3ZtvdVFe73Mpqx1P6JfpNq1UbeGieF4/jKCRCgKpA8IU+uXuwPenldkunjOXcEneV9F7uPS8vIZL2ZttuJTpNq1UbeCiSMa/BP48zq9XsEkd0qUw+TqPQgEtZ/YyXCqqLvZVGC5lGnpYrEw3D4vV6Tat1G3gorwIIDq7RVGG5bVo5ZiiIzenQE4rv+nPMVwqJDVcKsRbt2lv0UCyZ5Vtr+8fD5n58w79qia9XuK2cNGRxH8NaO6luZ44MA+Tl6MpWzJcKgQ3XCrEM1yqxOMG/QyXWiW7Sd8WLnr6rQMuW8YZ9fJiZv4yXCqq0HCpEG9+4fLYnS7X/G31dfp5Wy7uvTNcqqXsxEBbuDwVeP9QDl4PaP/LTF+GS0X1GS4V4nUHl/vu//GUkyO/fdIenZwced3KlSlRPRbWrl3svwyXqmbYWeI2cNkEuBK4DfAsWFx+qiXIu3q12Jh6SR5Dz3x5FnPc8/zNW3nnrT4Ml876814ZbgOX5pjjfwFeELlv9r14KfKo6ux55z1vnVnfy7vD7ld9PaNX+MpZt9PqzdQv+S7sGS4Ztd1/G8vBZU9AnouWIe8NHBCrxV4K3CFWi2n12MxeHharqDoPi1WI182EdBcwyPYkDZeqZjMziZeDy3JjoxtF4MqTTjo0pcKapaU7PuSX38kw+OUv3XLrLjqLvn/JZ3dm81bebP2y7RkuGb1D/20sBxd5K/Jcxl2nhSfT/5KOyaE8l2y4ZL+M2fbmrbOdt/Jmt5dse4bLzHaXE2V8ObgMGtsGkKei69r4qbFi7dif2ctwqag6D4tViOdhsSrxAK8Wq1Ww2/Rt4fIm4OARWfGw2IAoXcQ68rBY+QvQ1Q747C/5ebNnz6W8Tc9SyjZw0bCYJu0Vav9tQ56KoLMYGXdWL3suFTVnz6VCPHsuVeINeC7Xrtw5ZVPmTdaeeyeHf6mtlRvSt4GL7j4fOBXQKrGN6jJcKqrTcKkQz3CpEm8ALpmekOFSWyuTw+W54bWcExGSGwuPiwCWeTmasiXDpULwgMuhKz++tsLK9Ulfv3aPlfrHcTu99/MZ9l563gEPXbTT831HHhYrq+1mzsVwKdOv61RtPBfdozhiiuMj93NwGGw74GddZ7JL+4ZLhboBl8yXW7nJtme4lNVxV3OI2fWbac+eS1lbGZWqDVxuEoeEvcPDYksL39XLmP1lm93ZZr7chkv5yz0r7a/P7cVwKW9/wynbwEVpPhgHg+mI418NGPmw97ncoMasvNyGS+ELNCNzTNkfI9n2DJfC9jdjydrC5QcxLDZcPC9FHlDEcKlr/V2MoXvOpbxOumrPhkt5ncxSyrZweRSg446Hr0/Yc7Hn0ufOwnAp744Ml3LtnBLawuVVwG1HCPbKodVjM6epJ/QrqswT+hXieSlylXheilwrX+fp28LFw2ItqqKrL73sMW/PubSozFG3eM6lULh1yZr3o8+erif0q6p4vcRt4aLw+lo1putWwDHAvYHdHFvMw2J97iw8LFbeWXT1sdTn9mK4lLeX4ZRt4TKcTue6/DNwH+CCvOxM35KHxSo097BYhXgeFqsSz8NitfJ1nr4tXD4H3HUgN4qQrEtHH3sTZYjR1Zeeh8XK3oNm9Vn2MGB2fcybPXsuZe151lK1hcsZwJ2jcApiKW9Fnsu/z1qBh/Nrz6WiBu25VIhnz6VKPHsutfJ1nr4tXDrPyIZ6gOFSobzhUiGe4VIlnuFSK1/n6ZeDyzeAWy6RiwcC13Seyw4fYLhUiGu4VIhnuFSJZ7jUytd5+uXg8lngZkO52HXg39r7cnXnuezwAYZLhbiGS4V4hkuVeIZLrXydp18OLoMZ2DaWIO8DfBE4BDi7Ioe3D6+niVWmpc6bLuMJaQHBMMzGpdsM+MXAkcwjs2q4VNSg4VIhnuFSJZ7hUitf5+nbwGULQDvxdVCYQu7r5/uX67SXyflWwNcAnQdzFnBgwOoS4KbAM4DLB2zonI8TgIsBpT0IOHdMuuuAEyMsje7Vnpx3j8uP4VLRxgyXCvEMlyrxDJda+TpPvxxcng8cHUuOjwTekLD0+ObAGmBr4AXAl4DfAJsDVwE6OvlSQBGYm0ur1Y4F9HM/4HnAXmPSCS7ycF4B3CVsyYv5+Sg1DZeKNma4VIhnuFSJZ7jUytd5+uXgoo56qatkzuU44JPAwcBrovNXAMwV8SD9fofwTppnfxfYHdDPHYGPAZr7GZVOedbvP6D2Fx6WbF9ouCysq+/kkxn7vG+hi/LO276U7PL2ub14h34ec5aDy3sBeRrjrmfHvEbbHMnreCLwzACE4KJNmCcBmtPRpd3/jwCeM2D0p/F3eTTawPkZYO8x6QQ8eUYnR3rFRdsFuGj16tVHLiwsvHo4syeddGjb/C9535o16/i1alWzx7TObFf2Vnyz4Xhd/i7Yfl1whm1WraozFKkvXKNqy7eXXd6+12/f89f79rJixXL9Ykp739iNTFvEL8S5MD8CHgx8C/hTQBEANDEvr+MlIfobB8TXqjX9Xme17wwoSvNTYqhrOJ2GxASj44FNgCtjyO3aUZXpYbGKJu5hsQrxPCxWJZ6HxWrl6zz9tOFyz4F9M+8E/gH4KCDovDAm+U8H5F1oon874JyY67ki5n809yJv5wjgqyPSaV/Oi4A9gf1jAYICbI68DJeKNma4VIhnuFSJZ7jUytd5+mnDZbBACh3zuoDIvsD74o+nAk8HtELszDhHRuM4go2un0Q05h8Do9IJLqcB28fS5j2WWjJtuFS0McOlQjzDpUo8w6VWvs7Tb0i4DBdOofx1bLLmVXTp31o51sy9aIny3WJSf3ChwXC6xq68pMtiRdlYIQ2XijZmuFSIZ7hUiWe41MrXefo+wWW4sFpGLNic36UK8wiXnXb+jfYTVV/nnXuzu8tIn1f/LBYyeXVc9uqpebPX5/bi1WLV3cL1BvoMl7xSLmFpHuGS3Zn1ubMwXMpfo66OkOhzezFcytvLcErD5aijrstaitzVy5gNg2x7fe4sDJfyzqKr9tzn9mK4lLcXw2VIAXsu5Y1pFs5EN1zq63eePkYMl/L2YrgYLsxTZ2G4lHcW9lzKtXPKdeFR5vqy51Je/fZcyrVTyq467+yPh2x7Hharazezktpw8ZxLcVs1XIqlW0xouNTpt7B27WL/lQkrD4vV1clgasPFcCluTYZLsXSGS510i6kNlwQROzRhuBguxc3LcCmWznCpk85wSdCvaxOGi+FS3MYMl2LpDJc66QyXBP26NmG4GC7FbcxwKZbOcKmTznBJ0K9rE4aL4VLcxmYFLnd9+Sv/s7iQAwkvPfq1D9M/s1dPzZu9zAl41UemPU/oZ7wp62wYLoZLcWuaFbjMW+fd9/JmwsBwKX59O09ouHQAl9+tfLBOv6y+Nll7zp1n4Uu5z53FLOjXdxhk56/P7cWeS3W3db0Bw6UDuGS/PNkvd7a97PJm28sur+2VdUCz4OkaLmV1OyqV4WK4FLemWegs7LkUV29nmzyzPx4y7Rku5e1lOKXhYrgUtybDpVi6xYTeoV+nnzdR1unXdWrDxXApbmOGS7F0ncJl1cpvX1iXs3Wp16y97zZdeH6Znobyl2nPnktGy1lnw3AxXIpbk+FSLN16cDlkp09/pc7SutTHn/fIHbI7W8Mlo2bm04bhYrgUt3zDpVi69eCS+eVtuJTXiYbZ7LmU6zec0nAxXIpbk+FSLJ3hUifdumEXR0VOULE7E4aL4VLcuuYVLleufHTKMNYWa8/sZBgr2xPKXnqdnb9Me/ZciruDGyU0XAyX4tY0r3DJ7My6GMbKzt+vVu6askDgFmu/uLhAIDt/mfYMl+LuwHAZVqCLkygzG3sXE6rz9CXahX7Z9Wt7ZR2ah8XKdJtWKnsu9lyK25o9l2LpOpsz6Ltn0Pf82XOpa9ODqQ0Xw6W4NRkuxdIZLnXSdaaf4ZJQMWHCcJkBuDx+5Q8vy6jy/1h7p7vM4zDRvA0Depit7G3xUuQy3calMlxmAC7ZncW8dbbzVt7s9jJP9uy55AHGcDFciluTh8WKpetsWKfvcxp9z5/hUtemPecyoMAsrBbL/nKcty/5eStvdnuZJ3uGi+GSpoDhUi6lPZdy7ZSyi6W0ffcM+p4/w6WuTdtzsedyXUYTMlzqVDRc+qef4VJXJ4aL4WK4FLxDswLTeRrGyvaEDJeCF2NMEk/oe0K/uDXNSmfrOZeyKp5Hz8pwKWsro1IZLoZLcWsyXIql82qxOuk6089wSaiYMGG4GC7FrclwKZaus84xe5ho3uwZLnVt2nMunnPxnEvBOzQrMPWcS0Hlxuo9w6VMOw+LjVDAS5HLG9OsdLaecymrY8+5lOnmVOsU8LCYh8WK3wXDpVg6D4vVSdeZfvZcEirGcy7rFLDnUt6YDJdy7Ra/7Do4pnfe5kiyy2u41LVpz7l4zsVzLgXv0KzA1HMuBZXrOZcy0ZZItaGGxbYAfgr8biBvNwE2Ba5ZIr+3Aa4e+vu4dJsBvwCuXUo1ey7lbWpWOlvPuZTV8Tx6VvZcytrKqFTThsu9gA8ClwO/Bc4DXgscCBwCXALcFHhG3NPkeSVwAnAxsBVwEHDumHT6Kj8x7OveY4B3j5PMcClvTIZLuXYeFqvTriv9DJf6emksTBsurwRuBrwauGV4FgKAoLE5cBXwJuBSYPVAMc8AjgX0cz/gecBewG9GpBNc5OG8AtDhWLIlL+bno2QzXMobk+FSrl1XnWP2HMS82TNc6tr0hpxz0bCXOv9fAk8EjgP2AD4OrIiMHQzsEN5Jk9fvArsD+rkj8DFgV+ATI9LJvn7/gVgNp2Ex2b7QcFm7+DExb8NE81Zez7mUdZA+ibJMt3Gppu25KB83Bw4HXgY8CbgCOAnYNjJ5APAI4DkDmdb8jP4uL2Qb4DPA3mPS3RZYA5wc6X8A7AJctHr16iMXFhbkNa13nXTSoSmqrlmzjl/brFqVYu/CNSpGvr1VqyRh/eXy1mnYVf32vf31PX8rVqzYEP1iXWPqYeppi6ihMPWYvwbkoQgW8mY0ZKWJeXkdLwmd3jig12fj92uBnYFXAU8Zk05DYoLR8cAmwJUxdDZyYt/DYuWt0sNi5dop5TxOmKvcffasPCxW16YHU08bLn8GPAHYd6gIXwVeCHwNOD3mZM4CtgPOAd4QHs7RMffyM+AIYFQ6AexFwJ7A/sBLgd3GSWa4lDcmw6VcO8OlTruu9DNc6uulsTBtuLwLePZQ9n8vIPK++P2pwNM1NQCcCWiYS3Mmgo2unwQsfhyQGk4nuJwGbB9ekeZ0zjZcbvhSnrc5iHkrb589A3sueZ133y1NGy5L6XEr4HYxVKb79G+tHGvmXrRE+W4xqT+4CXA4XfOMewKXxYqysc+151LeRO25lGvX1Zd33zvvvufPnktdm96Qw2KT5FzLiAWb8ydJNOm9hsukit1wv+FSrp3hUqddV/oZLvX1sqGGxfJynmTJcCkX0nAp166rzrHvnkHf82e41LXpWfFc8kq5hCXDpVxmw6VcO8OlTruu9DNc6uvFnksoYLiUNybDpVy7rjrHvnsGfc+f4VLXpu25DChguJQ3JsOlXDvDpU67rvQzXOrrxZ6LPZfqVmS41EnoTZT9089wqasTey72XHyeS8E7NCsw9T6Xgsr1eS5loi2Rqk/7XNIL18agh8XaqDT6nlnpbL2JsqyO59GzsudS1lZGpTJcjjrquqzAle5s6xpmV52Z4VJWL13VR589K8OlrK0YLiMUsOdS3pgM03LtupqQlt0+d959z5/hUtemPefiORfPuRS8Q7MCU8OloHI951Immudcxitgz6W8Tc1KZ+thsbI69rBYmW5OtU4Bz7l4zqX4XTBciqVb9/KtXXcyqD2NMh270M/DYmV14TkXz7ksdmZXrNxTh65VX3dce4aOReh953jRzvt9vrqwwL3P/dBDZ6G8hlVZbfuY4zLdxqWy5zKHnos7n7KXqIsvZcOqrC668vzsuZTXx3BKw8VwKW5N7myLpfOwWJ10nelnuCRUTJgwXAyX4tZkuBRL11nnaE+ovE48LFaunedcPOfiCeSK98cwrRBvRhYw2HOpq+PB1PZc7LkUtyZ3tsXS2XOpk64z/QyXhIrxsNg6BeZxn4sn9MteIMO0TLcm1SzoZ7jU1bE9lwEFDJfyxjQLnYXnIFy/bRXwnEtbpdrd52ExD4u1aykj7jJciqXrbFjHMC2vE8OlXLtRKQ0Xw6W4RRkuxdIZLnXSdaafh8USKsZzLp5zqW1Ghkudgtavf/oZLnV14jkXz7mkREV251j3Ilq//ulnuNTVieFiuBguBe+QYVAg2kCSWdDPcKmrY8PFcDFcCt6hWegcPaFfULHNHMHatQuGS7l+wyk9oe8J/eLW5M62WLrOJqQNl/I68Wqxcu1GpTRcDJfiFmW4FEtnuNRJ15l+9lwSKqbxBPNMzaYlb6IsrzfDpVw7pbR+/dPPcKmrE8+5eM7Fcy4F75BhUCDaQJJZ0M9wqatjw8VwMVwK3qFZ6Bw951JQsc0wjif0y8UbkdJzLp5zKW5Q7myLpetszsBwKa8TT+iXazcqpeFiuBS3KMOlWDrDpU66zvTzsFhCxTSeYJ6p2bTkCf3yejNcyrVTSuvXP/0Ml7o68ZyL51w851LwDhkGBaINJJkF/QyXujo2XAwXw6XgHZqFztFzLgUV2wzjeEK/XLwRKT3n4jmX4gblzrZYus7mDAyX8jrxhH65dqNSGi6GS3GLMlyKpTNc6qTrTD8PiyVUTOMJ5pmaTUue0C+vN8OlXDultH79089wqasTz7l4zsVzLgXvkGFQINpAklnQz3Cpq+N5gctmwC+Aa5eSy55LeWOahc7CcxCu37YKeM6lrVLt7tsY51zuCJwI/BbYCjgGePc4OQyXdg1l5ITd2rWL7ee6lSvtCRXIaDgXiNaxJ2TPpa5ONnbP5TDgNsArgLsAlwLyYn4+SjbDpbwxuXMs185zLnXadaWf4VJfL42FjdFzeQfwCeADmjONYbEVwIWGiz2NmlfHMK1RbzYWMBgudXW8sXsuawD9d3IU9AfALsBFq1evPnJhYeHVgwJsttlmXHPNNXmK2pIVsAIzq8D97nc/9tlnn43xo3vqdbIxivgq4KfA8cAmwJXA5stN7C+lvIbODjvssDStbK+unVs/6zeJAtntZZJnz/O9aR1mj0TcF3gRsCewP/BSYLea/GU3TturqQ2wftZvEgWy28skz57nezdGuGwKnAZsD+j/9wDOrqnk7MZpezW1YbjUqWf9avVz+nYKbIxwaUp+T+Ay4DftpBh/l2FQp6D1s36TKND39jJJWeb53o0ZLmn1qoUAhx9++JFZBm2vTknrZ/0mUSC7vUzy7Hm+13CZ59p32a2AFbACHSlguIwX9vHA54CrO9I+w+ztgVsC3x8w9kDgG8DvKh+gYUWturuq0k6TfLuwNZjXGtP3Ab4H/LLCiLRr0muOTvZU5pKr6/ayZax4/FFJ5gbSbAHcQUvzI4pFpTluB/xebFaWfn26unw/+lTOXubFcBlfLepkvgscAJzXw9p7AfAPAT+Ft3lx5FF5Vkf+swnzvDfwugDAWcChYfu1wNET2rppLKQYTPYn0aEJ2B8v6Ni+ADwcuBnwMWCHMP4S4J0T5k+3HwIcCDwU+AxwJ1jsKLWUXcvYJ72y28s+Ub/fAQbr41jgNZNmDtgV+Bdgm0irj6b/AZ4HfLnAnnT757D3TeC2wM0Btct/LbCXnST7/cjO30Zvz3BZGi5azvz3wH8Bb4yfJY1C+20UOWDcpRdhki9wdbD6SlSHcQVwBvCG2DhaCpevAi8DHgSoA7tXAOrcWHn3qwkKrlV634rO+j8inWBwOXAxcNCE5ZUJdd76en8SoOXmAoO+TAWG+00IK3ksPwTuCzwG2At4BnCr6Gh3HBcuaAkNlL+s9qLHyPtUu3gYIMDfNWCvD52dCzzq8wOoXwyA/h9wTqysvHMEeZ2gitHmZAFakTCa2HL3B74W+8om8Xhn4f2YRBvfG+FRLMRoBdRZaGhIkZWfCRwene3pEbds0lVo+kJ8K3Aw8JOhR+oFVaDNtpfgouEReSiXAL8f3oBe7q8XeC7yNFQebTZVPt4fHbjysxZ4KvDttpmL++QFvCXs/UV0ROp4Pjyhneb2Bi5/GUMwJ8QftOxcXtv/TmBXnZmG53YH/jDq+Yh4H6SffqeVhpNcme1F9aF6VfsTSD4Y/6/8fClAOEl9NPbuHe1ZXuqTA9CKZKGoFYJZ26vZnPyA+FgYTKf8/Wm0w7b2dF+f349JyuF7QwF7LuObQtNZNF9gekEfAjwqvuwn+ZJvnqIXT1/dk3Zco3L5rvhi/6uIpfZs4P+Fl6HAnZMOi/078Gvg5dFRy8YLgaeHN1P60mg4TGCWx/L2CrjII1MQUl0C17bxBf4sQPMvk0Zm1kZbDf1pmE7wfB9wjxgK1cfEpFd2e5HHLC9Skb1VL/8Z0SbkZansk16vj/byqej85aXqY0TekTy4JY+mGPEw2ZMXqXYjr0gfJo8c2Fs2ycfSLLwfk+o99/cbLuObgIaZXlkwXLBUo9KYtDqKjEvei4Z0NHauDlKX/q2hGc0bTDLMprSCyX4xv6RhQAX71PCVxtU1Nl9zqfPXfM7fAZ+vMKRhsa3jK/5DgLwYeX2lE8nqvP8gJqQVNVtf74pLV1JH2e3lJsAjYjhQYBYMlUd5bBoKnfTSUKUWHegDSUBQPWheR56pvKSSq7GnOpHnqCHUzxYMKTbP7vP7UaLPXKcxXKZX/YKBvvRWxhejvsQVOUBDHhp6m/SyPes3SZvJbi+TPNv3zqEChsv4SteX+7hL4fsnHYbRMJaGHzTGrWWgOmNGQxxavaOxf9tb+gW0fv1qL5nvR/aEvlpSZv7mEA31RTZcRmuoxi4AaAxeq4qGh0k05j3y8LExVSJ7GoPW4WVaZdNc+r2Wccqj+e8JqtP21oll/do1mi7aS+b7oVJkTuhnv7/tVPZd6ylguIxvEBqjFgi0QSxjAl7j+Rov154UrfTSAgENkX00hsm0THeSy/as34ZsL9nvh8qSueCli/xNovfc32u4LN0EtGpIG8ImXXk1yqr2Ymho58ExCa8JdO0z+BvglIKWaHvWb5Jmk91e9OzM90P2Mif0u8jfJHrP/b2Gy/SbgDbq3T2WvE66omtUbm2vrg6tX51+XaTWJlatktlELQAAC8BJREFUZCuJRNBFfmyzQAHDZbxo2hGtpcjaBb8ToEl87TXQbulJNuyNesKjY2npHxfUme2B9atrOH3XT0vqtTFWe8IyruzyZuRpo7dhuIyvYsWy0rDVewCFytAX7uOAY4A7Fu6FaJ6W/fLYXt2rav36pZ8+6J4GKLJDxpVdvxl52uhtGC6jq7hZXaPYVVcO3aJJx+dUxBmTOa020+a9koCLo3Jse3WvqvXb8Ppp7lEbWBUiKPvKrt/s/G2U9gyX8dWqmFXa/a5IshoGU9RXAUFfU4rldc2ELUK76BW8UqvFMi7bq1PR+vVLP4XPUXgfxaP7p8qRAZUsu37r1JrD1IbL+ErXJkfNuSgqrTY/aj+Khsq0nLhkzkUvj0LFa0WMYoBNEnhwVC5tr+6FtX79008exmHAE4DjInpFSagblSy7fuvUmsPUhsv4Sm/OJNFci5YKNxspm3hbk0ZFbgIbKuKuYmwp9IvidukL68cFbc/2rN8kzWZW2osCxSratwJr6l1TnDvNwUwaIim7vJNo7Xsdcn/JNvCPEZZFHb+GxHYLwJSelzIYNVfeyypAEYMfG0EjJ91LY3vWb5JObJbaS1MunbujfWEaMZg0ynJ2eSfR2vcaLmPbQLO7V+FaFOZFcyVaiqzIvhlwGXywPCN9lU0aW2w4xHtj0/bavdrWb51OfWkvisitaBWTjgiMq+3s+m3XqnzX9Qp4WGx0Y1C4cx3opSEsLUfWueMKO68ljZroLzlGWBsndUDVpBAZ11xtr+5Ftn790q8uNzdOnV2/2fnb6O0ZLuOrWCdG/m2cGfK22Ej56RjCKjmMa6NvTC6gFShUQP3QAUukPbFgWKwwK06WpYDhsrSSCoevjZP/ELdp86QO4tKRuBvyjPDsEOW2t3470OmMk4TmsX51+mmkQEdrax5Sh78NL/PXQWkbsj6y+tu5smO4LF3dWjH2HWCXGNLSyYVaiqxoxpNemSHF9Wzbu6EG1CFNOuFr/fqln3JzAfDQpCjk2fU76fs+9/cbLss3AXkqWsmldfc6ylbnrmiCv+TKDCmu59teSS3ckMb69Us/fbzp/So5ZnpUSbLrt06tOUttuCxf4fcGTgceGDHGdL7LJENig0/IDilue8vX31J3WL9+6afc3C7OUNJu/e/VZS89hH9lduYrueHSrr61s16buRRrTHHFSq+7Afo602ozrRw7t3C3f/N82yuLlmD9+tf+NBymTcWa51Q0DO0tE/w1/6UzlUqu7PejJA9zm8ZwaVf1WoN/cmyk/GK7JDe6S5OS2iejFWcKH3PrWOr8EeClBTZtb91ScevXrvH0vb3o1NdDYkK/Wa5//whkuXnBaEF2edup7LuuV8BwadcYbgHsXfEFJZ01lKbAl/KAmktLmgUaLRCYZAjA9tYpaP3atd++txettlP08QcAFw8VSfMmfwp8vV1RF+/KLu8Ej/atjQKGy3TagnS+DJAHpFhizSXX/8vAnrFSpm1ubG+dUtavXYvpe3tRKV4PPAn4d+B8QN7KIwFFy9hjwtWA2eVtp7LvWk8Bw2V6DeIpwNtjabPGlLXrf3fg74HDC7Jhe9ZvkmbT9/aisjweeAiwdXj0mpP8bIRgmqSsuje7vJM+f+7vN1ym2wS2DNd/q/BUvlowljyYY9srX7knHa1ff/S7V0ze66gLbVpWuCVdWvavaBmTRkXuon6n21vM+NMMl+lV4CPiiGQttdQ5MSfFo7VxTCvIJo2KbHvrBLR+7dpw39uLYvZpw7KWIAsmWvqvSf7SQLHZ5W2nsu+6XgHDZTqNQTprQlJHuWoJsk633DfmW0peHtuzfpN8jPS9vSgys0K+3CzmVrRqbAfg2YVwyS7vdHqJjewphst0KlSTkgrdL5dfPzW2rJ3/Wj12UUGUZduzfpPApe/tRW+hPrL+GnhPRA4/C3hr/G7SKOTZ5Z1OL7GRPcVwmV6F6sAjLUM+JiYrdU64NolpBZk2e03SWSjXtmf9Jmm9fW8v+tBSiCWtFnsNcIfYw6TNlSVRyLPLO4nWvteHhU21DQggGkvWSrH3AgqKqbmXP4pVY8ORYJfLnO1Zv+XayODf+95expVFUTF0ttK1kxQ2Ptgy37cJH+/b7bm4DVgBK2AFrEC6AoZLuqQ2aAWsgBWwAoaL24AVsAJWwAqkK2C4pEtqg1bAClgBK2C4uA1YAStgBaxAugKGS7qkNjikgOKnfT5+dwDwvgi78sP4nfb7aHNpyaUoutqMqnNAtNruR2FLNje2S3ujtIv9j4EPb2yFc3k2PgUMl42vTvtWokG4aFOcDn/S8QXaz6Dr1bGvoSTfTwNOjHPXFUn3CuCowkCgJc+fZppGsycDH5rmg/0sK1CigOFSoprTTKJAAxd5KtqvsG14FwrtcY8BuGiz3BuBBwPfinvk5TwcOBb4FPC4iHCgQ9e+AfxHHIl7HvA84Jz43R0BBQc9Afir2PHd5Fm7txXeXfuLFC1BR1gr3MhdgH+LIxEU600hSf4uDq+S16Dd47pXntK3I086OO4+wAuBZ0SoeNlSfhSI8U1xwJzOKFEAxrcBhwL7hBeiEPOKAqwy/nmEmNdhcvp/gVL3CZa3jFNLVwGGyyStz/duMAUMlw0m/dw8uIGLQPEnMSSmY2sV9kbDZPJc/jZirkmUt0QHqsCFgo8OUtNpk1dHOJDnA5cHhI4GDgpYqPNWp69L8FHHvX103oJOcz0VeD9wfGzM0ymg+0fnrcCJuhRUdLd4/n2BXWPjq/6m8CTPAgTLuwKfjOcIjM+N8un3AqLyKvs6MVOeh4DzckCnJOqSJvLkVDYNHeo4bQ0RCmICi4b5dL0zyqmd6obL3Lw6s11Qw2W2628Wct/ARbul3xydo46MVqf6jwGXz8Txz+qMFRZHXowOVXtxnEwouAhMCvipv/9ZhAd57IhhMQ2TyYt4ZoBAXoc67ebSOToCjACgw6geBhwZ9wouyqOeK4/i7ICBIvUqqkLTsb8s4CEAnALIg/n4gD09UyeMan5EYUyUTmfDCzLymAQXlVHxswS2NfGfhvYODKjtFd6NQKY5JXlOmksyXGah1TuPi8eB+rICXSrQwEVH1QoKuuQJ7BTDR/JcdBrnR8OT0df8jvG3IyIem+CizlbDYOr81Tmr0x4Fl2bORYdFfWAgXVNGQU7DVZq3UKw3ddqDcJEHIm9DnpPO29GwmoIqCi7yhpQXDYPpkLcGkPI6NGzXXB8EXgs8MYb6BDQNAw7CRadoymPRQXHytATFCwds6P81rNdM4DewNFy6bK22naaA4ZImpQ2NUWAQLr8fnoDiqwkWGhoTXBTMU2d3aFhLQQv19a6O+X4xp7EcXAQbraC6ZGBCfxxc5P08PWyrw9YciADz7jhPRB2+vAXlQZ6J5l8EGsFFENE8jMAhz0fzLcq35ogET3lEu0Te5YXIE1JgUnlbjwYeE4BSfm8dK9x0xLWGwQQX3feXEXZew30/Dq9IzxSElA/Dxa/aTChguMxENc10Jgfhogl9zbdoXkVzEoJLsxRZX/bvGiipgKP5CU2gCy7N8Ja8Dnkf8lx0kqTmUzQXocOhNLy2OryNZrip8Xga0+rkNXGvNOrU5f0ITPJWBAOBT3M1uuT5CEQaZhNcNFEvj0uXJt11YqIAJM+n+b2GzBTdV3nXwgFdGjLTOfDKtxY0DMJFfxfg9Pw7hTcjD+nM0Ebg0/WfMYQnWElDX1ag1woYLr2unrnLnFZFaZWXDlSTB9Hm0gFT8gJ+CvyuTQLgFsDm4XU0Se4dcFFHr6E3nb2jFVu6NN8juGiSX17Kr8LrGHycJut1v1agNZeGw37bsiybxIS/huCUprkUFVjvaTO537KIvs0KbFgFDJcNq7+f3h8FBuGiVWiD1yBcNHnvywpYgWUUMFzcRKzAOgW0/0Urx7TKa3BiXX/TWSj3B74Ue3WsmRWwAoaL24AVsAJWwApMWwF7LtNW3M+zAlbACsyBAobLHFSyi2gFrIAVmLYChsu0FffzrIAVsAJzoMD/B5HKa+yQKv4RAAAAAElFTkSuQmCC"
     },
     "metadata": {
      "jupyter-vega": "#f83f177f-65a2-432e-8024-515eae3a77a6"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plotdf = emberdf.copy()\n",
    "plotdf.loc[plotdf[\"appeared\"] < \"2017-01\", \"appeared\"] = \" <2017\"\n",
    "gbdf = plotdf.groupby([\"appeared\", \"label\"]).count().reset_index()\n",
    "alt.Chart(gbdf).mark_bar().encode(\n",
    "    alt.X('appeared:O', axis=alt.Axis(title='Month appeared')),\n",
    "    alt.Y('sum(sha256):Q', axis=alt.Axis(title='Number of samples')),\n",
    "    alt.Color('label:N', scale=alt.Scale(range=[\"#00b300\", \"#3333ff\", \"#ff3333\"]), legend=alt.Legend(values=[\"unlabeled\", \"benign\", \"malicious\"]))\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_test_pred = lgbm_model.predict(X_test)\n",
    "y_train_pred = lgbm_model.predict(X_train)\n",
    "emberdf[\"y_pred\"] = np.hstack((y_train_pred, y_test_pred))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ROC AUC: 0.999112327\n",
      "\n",
      "Ember Model Performance at 1% FPR:\n",
      "Threshold: 0.528\n",
      "False Positive Rate: 1.000%\n",
      "False Negative Rate: 1.833%\n",
      "Detection Rate: 98.167%\n",
      "\n",
      "Ember Model Performance at 0.1% FPR:\n",
      "Threshold: 0.871\n",
      "False Positive Rate: 0.099%\n",
      "False Negative Rate: 6.999%\n",
      "Detection Rate: 93.001%\n"
     ]
    }
   ],
   "source": [
    "def get_fpr(y_true, y_pred):\n",
    "    nbenign = (y_true == 0).sum()\n",
    "    nfalse = (y_pred[y_true == 0] == 1).sum()\n",
    "    return nfalse / float(nbenign)\n",
    "\n",
    "\n",
    "def find_threshold(y_true, y_pred, fpr_target):\n",
    "    thresh = 0.0\n",
    "    fpr = get_fpr(y_true, y_pred > thresh)\n",
    "    while fpr > fpr_target and thresh < 1.0:\n",
    "        thresh += 0.0001\n",
    "        fpr = get_fpr(y_true, y_pred > thresh)\n",
    "    return thresh, fpr\n",
    "\n",
    "testdf = emberdf[emberdf[\"subset\"] == \"test\"]\n",
    "print(\"ROC AUC:\", roc_auc_score(testdf.label, testdf.y_pred))\n",
    "print()\n",
    "\n",
    "threshold, fpr = find_threshold(testdf.label, testdf.y_pred, 0.01)\n",
    "fnr = (testdf.y_pred[testdf.label == 1] < threshold).sum() / float((testdf.label == 1).sum())\n",
    "print(\"Ember Model Performance at 1% FPR:\")\n",
    "print(\"Threshold: {:.3f}\".format(threshold))\n",
    "print(\"False Positive Rate: {:.3f}%\".format(fpr * 100))\n",
    "print(\"False Negative Rate: {:.3f}%\".format(fnr * 100))\n",
    "print(\"Detection Rate: {}%\".format(100 - fnr * 100))\n",
    "print()\n",
    "\n",
    "threshold, fpr = find_threshold(testdf.label, testdf.y_pred, 0.001)\n",
    "fnr = (testdf.y_pred[testdf.label == 1] < threshold).sum() / float((testdf.label == 1).sum())\n",
    "print(\"Ember Model Performance at 0.1% FPR:\")\n",
    "print(\"Threshold: {:.3f}\".format(threshold))\n",
    "print(\"False Positive Rate: {:.3f}%\".format(fpr * 100))\n",
    "print(\"False Negative Rate: {:.3f}%\".format(fnr * 100))\n",
    "print(\"Detection Rate: {}%\".format(100 - fnr * 100))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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zW9+0+vsS71kCJDUFDKT888/n0996lM1jd9www257bbbWHvttQuuTBq4PCdAUsPMmzePY445hk022YRBgwbVFABOOukkXnrpJf7+978bAKQV5EqApLppb2/n97//PZMmTeLZZ5/l1ltvrXnbo446ip///OcMGuR3F6mvGAIkFeq+++7j4osvZvLkyUyZMqXX28+dO5eRI0cWUJkkQ4CkPnfvvfdy1FFHcdddd/V62zXWWINPf/rT/PCHP/SSvVLBDAGS+kRbWxvrr78+zzzzTK+2a2lp4cADD+SII45g5513ZqWVVqK1tdUAINWBIUDSCrnvvvvYaquter3dOuusw/nnn8+uu+5KS0tLAZVJ6oln2EjqtTfeeIOLL76YiOhVADj99NN5/vnnyUxmz57NHnvsYQCQGsiVAEk1e/XVVxk6dCiZWfM23/3ud/na175WYFWSlpcrAZKWKTM544wzGD16NEOGDKkpAJx77rlkJplpAJCamCsBkro1depUttlmm16NX57zAyQ1hisBkrp0zDHH1BQAfvOb3/Daa6+RmQYAqZ8xBEh6U2by6U9/mojg5z//+TLHnnzyybS3t3PooYey6qqr1qlCSX3JwwGSAFiwYAFDhw5d5phjjz2Wk08+mTXXXLNOVUkqkiFAKrnMZIsttuChhx5a5rjnnnuO0aNH16kqSfXg4QCppDKTs846i0GDBi0zAJxyyim0t7cbAKQByJUAqYTuvPNOJkyYsMwxn//85znzzDPrVJGkRjAESCXyxhtvsMoqq/Q4rrW1lZ133rkOFUlqJA8HSCVx0kkn9RgAvvCFL5CZBgCpJFwJkEpg66235t577+22//Of/zw//elPvXOfVDKGAGkAe+2111h99dWXOeaVV15h2LBhdapIUjPxcIA0QB122GHLDACXXnopmWkAkErMlQBpABo6dCgLFizotv+1117zKn+SDAHSQHPuuecuMwC0t7d77F8S4OEAaUBZtGgRRx11VJd9Z511FplpAJD0JlcCpAFk8ODBXbYvXLiwpusDSCoXVwKkAaCtra3bb/ivvvqqAUBSlwwB0gBwxBFHdNk+bNgwVltttTpXI6m/MARI/dyLL77Ib37zmy77Xn755TpXI6k/8ZwAqR975ZVXWHPNNbvsy8w6VyOpv3ElQOqnMpPhw4d32ff666/XuRpJ/ZEhQOqH5s+fz6BBXf/6HnTQQd3+lYAkdWQIkPqZBx98sNtL/X7uc5/j4osvrnNFkvorQ4DUj+ywww5sscUW3fafddZZdaxGUn9nCJD6if33358pU6Z02Td06FBPBJTUa4YAqcktudTv73//+y77TzzxRObNm1fnqiQNBP6JoNTklnW3vyeeeIK3v/3tdaxG0kBS6EpAROwVEY9ExPSI+GoX/SMj4vKIuC8ipkTEuzv0PRER90fE1Ii4q8g6pWY1f/58Fi1a1GXf4sWLDQCSVkhhISAiWoCzgH8DNgcOiojNOw07EZiamVsCnwTO6NS/S2ZunZnji6pTalZz5szp9q8A5s2bR0tLS50rkjTQFLkSMAGYnpkzMnMRcAmwd6cxmwN/AcjMh4ENI2JMgTVJ/caoUaO6bM9Mhg4dWudqJA1ERYaA9YCZHV7PqrZ1dC+wL0BETADeDqxf7Uvg2oi4OyKOLrBOqenMnj27y/Zvfetbda5E0kBW5ImBXd3XtPPfMH0fOCMipgL3A38DFlf73puZsyPibcB1EfFwZt601JtUAsLRAGPGjKG1tbWv6u9z8+fPb+r6yqhZ52SXXXbpsn3nnXduynr7WrPOS5k5JwNTkSFgFjC2w+v1gbd8vcnMV4AjAKJyM/S/Vx9k5uzqz+ci4nIqhxeWCgGZeQ5wDsD48eNz4sSJff3v6DOtra00c31l1GxzMnfuXNZaa60u+8p0HYBmmxc5JwNVkYcD7gTGRcRGEbEKcCBwRccBETGi2gdwFHBTZr4SEUMiYlh1zBBgD+CBAmuVGu5Xv/pVtwHg2GOPrXM1ksqgsJWAzFwcEccC1wAtwHmZOS0ijqn2nw1sBvw6ItqAB4Ejq5uPAS6vLA6wEnBxZv5fUbVKjbJ48WImTZrEoYceusxxP/3pT+tUkaQyKfRiQZl5FXBVp7azOzy/DRjXxXYzgK2KrE1qpMzkM5/5DL/4xS9qGitJRfCywVIdLVy4kAsvvJBBgwb1GADOPfdcA4CkQnnZYKlgmcnXvvY1Tj311Jq3efXVV1lttdUKrEqSXAmQCtebAPDoo4+SmQYASXVhCJAKVksAeOSRR8hMxo1b6hQZSSqMhwOkArW3ty+z/7HHHmPjjTeuUzWS9FauBEgFaG9v56c//WmXN/mZM2cOmUlmGgAkNZQhQOpjp556Ki0tLXzhC1/osn/NNdesc0WS1DUPB0h9oL29nbvvvpsJEyY0uhRJqpkrAdIKuPbaa9lkk01oaWmpKQDMmzevDlVJUm0MAdJyWm+99dhzzz157LHHehz7i1/8gvb2doYOHVqHyiSpNoYAqRcWLVrEiSeeSEQwe/bsHsc/9dRTZCZHHXUU1XthSFLTMARINXj99dfZZ599GDx4MN/73vd6HP/1r3+dzGTs2LE9jpWkRvHEQKkHd911F9tvv32P4375y19y+OGHd/lngZLUjAwBUhdmz57NeuutV/P41157jVVXXbXAiiSp73k4QOpg0qRJRERNAWC//fZj4cKFZKYBQFK/5EqABDz//PN89KMf5fbbb+9x7Pve9z5uuOEGVl555TpUJknFMQSotG699VZ+9KMfscsuu9S8zdSpU9lqq60KrEqS6scQoNJZuHBhr5bvr776avbaa68CK5KkxhhYIeDuu6GJ/xZ7YqMLEPcBtX6Pv+eee9hmm22KLEeSGsoTA1UKdwFBbQHgyCOPZObMmQYASQPewAoB220HmU37aJ08ueE1lPEx5Y476Omv/A855BAeeOABMpNf/vKXrL/++nX5n6wkNdLAOhwgVT322GNsv/32vPzyyz2Ofe655xg9enQdqpKk5jKwVgIk4I9//CObbLJJjwHgMiDBACCptAwBGnD22WefZfb/+te/JjPZt071SFKz8nCABpQnn3xymf2e8S9J/+RKgAaMzGTffZf+fv/Zz372zVv6GgAk6Z9cCdCA8aEPfYh77rlnqfazzjqLaOLrR0hSoxgC1O+9/vrrrLbaal32HXvssQYASeqGhwPU733uc5/rtu9LX/pSHSuRpP7FlQD1ezfeeGOX7S+//DJrrLFGnauRpP7DlQD1ay+99BIzZsxYqn3u3LkGAEnqgSFA/do111yzVNvf/vY3Ro4c2YBqJKl/MQSo35o2bRoHHnjgUu2bbbZZA6qRpP7HEKB+4dJLL+Vf//VfiYg3H+9+97uXGrfjjjsyePDgBlQoSf2PJwaqqS1evJiVV1655vFf/OIXC6xGkgYWVwLUtG677bZeBYCddtqJ/fffv8CKJGlgMQSoKd13333stNNONY//1a9+xS233OKFgSSpFzwcoKbz4osvstVWW3Xb/7WvfY0999yTzTff3NsAS9IKMASo6YwdO7bL9g9+8INcccUVtLS01LkiSRqYPBygptHe3s6BBx7IggULluo777zz+POf/2wAkKQ+ZAhQ0zj55JOZNGnSUu0HHnggRxxxRAMqkqSBzRCgpjBjxgy+/e1vd9n329/+ts7VSFI5GALUUPPmzeNXv/oV73znO7vsv/322+tckSSVhycGqmEuuOACDj/88G77Z8+ezTrrrFO/giSpZFwJUEO89NJLywwAxxxzjAFAkgrmSoDqYsaMGdx111386U9/4u677+ahhx7qduxaa63FD3/4wzpWJ0nlZAhQYTKT+++/n9NOO40LLrigx/Hrr78+V1555TIvFCRJ6juGABVi8uTJfOADH6h5/Pvf/35uuummAiuSJHXmOQHqM4sWLeL6669n3LhxvQoAe+21F5deemmBlUmSuuJKgFZYe3s7xx9/PKeffnpN4zfaaCPGjx/Pnnvuyb777svIkSMLrlCS1BVDgFbIQw89xOabb17T2OOPP54jjzySzTbbrOCqJEm1KPRwQETsFRGPRMT0iPhqF/0jI+LyiLgvIqZExLtr3VaN9/DDD9cUAK6++moykx/96EcGAElqIoWFgIhoAc4C/g3YHDgoIjp/YpwITM3MLYFPAmf0Yls10Omnn97jB/opp5zC/Pnz2WuvvepUlSSpN4o8HDABmJ6ZMwAi4hJgb+DBDmM2B74HkJkPR8SGETEGeEcN26pBbrzxRo477rgu+975zncybdo0Bg8eXOeqJEm9VeThgPWAmR1ez6q2dXQvsC9AREwA3g6sX+O2aoApU6YwceLELvv2339/pk+fbgCQpH6iyJWA6KItO73+PnBGREwF7gf+BiyucdvKm0QcDRwNMGbMGFpbW5e33sLNnz+/qeurxUknndRl+5FHHskhhxzSr/59E6s/+1PNZTEQflcGGudkYCoyBMwCxnZ4vT4wu+OAzHwFOAIgIgL4e/Wxek/bdtjHOcA5AOPHj8/uvqU2g9bW1m6/RfcX7e3tS7WdfvrpfPGLX2xANX2jv8/JQDQQflcGGudkYCrycMCdwLiI2CgiVgEOBK7oOCAiRlT7AI4CbqoGgx63Vf09//zz3HzzzW9pe8973sPnP//5BlUkSVoRha0EZObiiDgWuAZoAc7LzGkRcUy1/2xgM+DXEdFG5aS/I5e1bVG1qmeZya677rpU+6mnnspKK3m5CUnqjwr9f+/MvAq4qlPb2R2e3waMq3VbNc7f//537r///qXaV1tttQZUI0nqC947QDVZuHDhUm2bbropW2+9dQOqkST1BUOAanLdddct1fbXv/6VlVdeuQHVSJL6giFAXcpMLrroIjbccEMiYqmz/9/1rncxatSoBlUnSeoLntGlLl144YV88pOf7LZ/9dVXr2M1kqQiuBKgLl1//fXL7D/44IPrVIkkqSiuBKhLixcv7rbv6quvZs8996xjNZKkIrgSoJrst99+vPTSS2Qme+21F5ULPEqS+jNDgLo0Z86ct7zee++9GT58eIOqkSQVwRCgt8hMjj76aK655ppGlyJJKpjnBOhN7e3tnH766fziF79odCmSpDpwJUBv+sY3vsHxxx/fZd+//Mu/1LkaSVLRDAF608UXX9xl+9lnn82WW25Z52okSUUzBAioHAp48sknl2r/yU9+wmc+85kGVCRJKpohoOTa29u56qqraGlpWarvrLPO4thjj21AVZKkevDEwBJ75ZVX+MAHPsDdd9/dZf8nPvEJrwcgSQOYKwEl9qc//anbALD22mszevToOlckSaonQ0CJPffcc122r7POOlx++eWuAkjSAGcI0FtcdNFFzJ49m/e85z2NLkWSVDBDgN70pS99ybsDSlKJGAIkSSopQ0BJ3XjjjXz5y19udBmSpAYyBJTQP/7xD/bcc89GlyFJajBDQMlkJpdccgkLFy5cqm/kyJENqEiS1CheLKhE2tra2HfffbniiiuW6hs1apQnBUpSyRgCSuTee+/tMgAMGTKExx57jBEjRjSgKklSo3g4oESef/75LttPPPFEA4AklZAhoOROOOEEvvKVrzS6DElSA3g4oMT22GMPTj311EaXIUlqEFcCSiIzefTRRxtdhiSpibgSUAKLFi3iwx/+MNddd12jS5EkNRFXAga4SZMmse6663YZALxLoCSVmysBA9TixYu54IILOOqoo7ods91229WxIklSszEEDEBTp05ljz326PZPAgGOO+44/uu//quOVUmSmo0hYABpa2vjjjvuYJdddmHRokVdjll99dWZPHkyEyZMqHN1kqRm4zkB/dyrr77Kpz71KTbccENWWmkl3vve93YbAD71qU/x5JNPGgAkSYArAf3WU089xWWXXcYJJ5zA4sWLexz/zW9+k29961sMGmTukyRVGAL6kYcffpgzzjiDRx55hMmTJ9e0zbBhw5g5cybDhw8vuDpJUn/TYwiI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\n",
      "text/plain": [
       "<Figure size 576x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8, 8))\n",
    "fpr_plot, tpr_plot, _ = roc_curve(testdf.label, testdf.y_pred)\n",
    "plt.plot(fpr_plot, tpr_plot, lw=4, color='k')\n",
    "plt.gca().set_xscale(\"log\")\n",
    "plt.yticks(np.arange(22) / 20.0)\n",
    "plt.xlim([4e-5, 1.0])\n",
    "plt.ylim([0.65, 1.01])\n",
    "plt.gca().grid(True)\n",
    "plt.vlines(fpr, 0, 1 - fnr, color=\"r\", lw=2)\n",
    "plt.hlines(1 - fnr, 0, fpr, color=\"r\", lw=2)\n",
    "plt.xlabel(\"False positive rate\")\n",
    "plt.ylabel(\"True positive rate\")\n",
    "_ = plt.title(\"Ember Model ROC Curve\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure(figsize=(8, 8))\n",
    "testdf[testdf[\"label\"] == 0].y_pred.hist(range=[0, 1], bins=10, color=\"#3333ff\", alpha=0.8, label=\"benign\")\n",
    "testdf[testdf[\"label\"] == 1].y_pred.hist(range=[0, 1], bins=10, color=\"#ff3333\", alpha=0.8, label=\"malicious\")\n",
    "plt.gca().set_yscale(\"log\", nonposy=\"clip\")\n",
    "plt.gca().grid(False)\n",
    "plt.xlabel(\"Score\")\n",
    "plt.ylabel(\"Count\")\n",
    "_ = plt.title(\"Ember Test Set Model Score\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
